/*
 *所有关于StoresRequisition类的业务代码应在此处编写
*可使用repository.调用常用方法，获取EF/Dapper等信息
*如果需要事务请使用repository.DbContextBeginTransaction
*也可使用DBServerProvider.手动获取数据库相关信息
*用户信息、权限、角色等使用UserContext.Current操作
*StoresRequisitionService对增、删、改查、导入、导出、审核业务代码扩展参照ServiceFunFilter
*/
using Mercury.Core.BaseProvider;
using Mercury.Core.Extensions.AutofacManager;
using Mercury.Entity.DomainModels;
using System.Linq;
using Mercury.Core.Utilities;
using System.Linq.Expressions;
using Mercury.Core.Extensions;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Http;
using Mercury.Order.IRepositories;
using System.Collections.Generic;

namespace Mercury.Order.Services
{
    public partial class StoresRequisitionService
    {
        private readonly IHttpContextAccessor _httpContextAccessor;
        private readonly IStoresRequisitionRepository _repository;//访问数据库

        [ActivatorUtilitiesConstructor]
        public StoresRequisitionService(
            IStoresRequisitionRepository dbRepository,
            IHttpContextAccessor httpContextAccessor
            )
        : base(dbRepository)
        {
            _httpContextAccessor = httpContextAccessor;
            _repository = dbRepository;
            //多租户会用到这init代码，其他情况可以不用
            //base.Init(dbRepository);
        }


        protected override IEnumerable<Detail> JoinTableByBeforeQuery<Detail>(IQueryable<Detail> join)
        {
            var temp = join as IQueryable<StoresRequisitionDetailed>;
            var queryable = repository.DbContext.Set<MaterialMaster>().Where(c => c.DeletionFlag == 0 || !c.DeletionFlag.HasValue);


            var list = from d in temp
                       join m in queryable
          on d.MaterialId equals m.Id into DD
                       from dc in DD.DefaultIfEmpty()
                       select new StoresRequisitionDetailed
                       {
                           Category = !dc.Category.HasValue ? 2 : dc.Category.Value,
                           MaterialId = d.MaterialId,
                           Id = d.Id,
                           BatchNumber = d.BatchNumber,
                           DeliveryWeight = d.DeliveryWeight,
                           MaterialName = d.MaterialName,
                           SRId = d.SRId,
                           Notes = d.Notes,
                           RequiredWeight = d.RequiredWeight
                       };

            //var list = temp.Join(queryable, d => d.MaterialId, m => m.Id, (d, m) => new MaterialRequisitionDetailed
            //{
            //    Catefory = m.Category,
            //    MaterialId = d.MaterialId,
            //    Id = d.Id,
            //    BatchNumber = d.BatchNumber,
            //    DeliveryWeight = d.DeliveryWeight,
            //    MaterialName = d.MaterialName,
            //    MRId = d.MRId,
            //    Notes = d.Notes,
            //    RequiredWeight = d.RequiredWeight
            //});
            return list as IEnumerable<Detail>;
        }

    }
}
